/*
例程93. 波瓦松的分酒趣题
整理优化by:千百度QAIU
QQ:736226400
编译环境:gcc/tcc
2017/10/23
*/

#include<stdio.h>
#include <conio.h>
#include <stdlib.h>
void getti(int a,int y,int z);
int i;           /*最后需要分出的重量*/
int k=0;    //计数，防止死循环
int main()
{
    int a,y,z;
    clrscr();
    puts("************************************************************");
    puts("法国著名数学家波瓦松在青年时代研究过一个有趣的数学问题：某人有12品脱的啤酒一瓶，想从中倒出6品脱，但他没有6品脱的容器，仅有一个8品脱和5品脱的容器，怎样倒才能将啤酒分为两个6品脱呢？");   puts("************************************************************");
    printf(" >> 请输入: \n\t满瓶的容量  a\n\t空瓶1的容量 b\n\t空瓶2的容量 c\n\t要获取的容量 d\n"); 
    printf(" >> ");
    scanf("%d%d%d%d",&a,&y,&z,&i);
    getti(a,y,z);           /*按a -> y -> z -> a的操作步骤*/
//    getti(a,z,y);           /*按a -> z -> y -> a的步骤*/
    printf("\n 任意键退出…….");
    getch();
    return 0;
}
void getti(int a,int y,int z)   /*a:满瓶的容量  y:第一个空瓶的容量  z:第二个空瓶的容量*/
{
   int b=0,c=0,j=0;           /* b:第一瓶实际的重量  c:第二瓶实际的重量 j: 倒的步数*/
   puts(" >> 划分步骤如下.\n");

   printf("   瓶子:    a<%d> b<%d> c<%d>\n",a,y,z);
   printf("-----------------------------\n");
   printf("   步骤   |\n");
   printf("   <%2d>   | %4d %4d %4d\n",j++,a,b,c);

   while(a!=i||b!=i&&c!=i)      /*当满瓶!=i或另两瓶都!=i*/
   {
      if(!b)
      {
      	a-=y; b=y;}    /*如果第一瓶为空，则将满瓶倒入第一瓶中*/
      else if(c==z)
      {
      	a+=z; c=0;
      }    /*如果第二瓶满，则将第二瓶倒入满瓶中*/
      else if(b>z-c)    /*如果第一瓶的重量>第二瓶的剩余空间*/
      {
      	b-=(z-c);c=z;}    /*则将装满第二瓶，第一瓶中保留剩余部分*/
      else
      { c+=b; b=0;}   /*否则，将第一瓶全部倒入第二瓶中*/
      printf("   <%2d>   | %4d %4d %4d\n",j++,a,b,c);
      if (k++>98)
      {
      	puts("无解");
          exit(0);
      }
   }
   printf("-----------------------------\n");
}